#include <stdio.h>
#include <stdbool.h>

// 函数封装性：小而美
int max(int x, int y) // 该函数接收两个整型参数，并返回一个整型数据
{
    int z;
    z = x>y ? x : y;
    return z;
} 

bool LCD_initialized = false;

// 确保此初始化函数在程序运行过程中只能执行一遍
char * initLCD(void) // 该函数不接受参数，返回一个字符指针
{
    if(LCD_initialized)
        return NULL;

    LCD_initialized = true;

    int lcd = open("/dev/fb0", O_RDWR);
    struct fb_var_screeninfo vinfo;
    ioctl(lcd, FBIOGET_VSCREENINFO, &vinfo);
    int bpp  = vinfo.bits_per_pixel;
    int size = vinfo.xres * vinfo.yres * bpp/8;
    
   char * fbmem = mmap(NULL, size, PROT_READ, MAP_SHARED, lcd, 0);
   return fbmem;
} 

// 形参，parameters
// 函数的声明
void swap(  double *p1 ,  double *p2 );

int main(int argc, char const *argv[])
{
    int a=1, b=2;
    int m = max(a, b); // 按值传递
    printf("m: %d\n", m);

    double f1 = 1.1, f2 = 1.2;

    // 函数的调用
    swap(&f1, &f2); // 实参，arguments 按地址传递

    printf("f1: %lf\n", f1);
    printf("f2: %lf\n", f2);
    return 0;
}

// 函数的定义
void swap(  double *p1 ,  double *p2 ) // 该函数接收两个浮点指针参数，不返回数据
{
    double tmp;
    tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
} 
